return EXCRET_fault_fixed;
}
- if ( (addr < PAGE_OFFSET) &&
- !VM86_MODE(regs) && ((regs->cs & 3) == 1) && /* ring 1 */
+ if ( (addr < HYPERVISOR_VIRT_START) &&
++ KERNEL_MODE(v, regs) &&
((regs->error_code & 3) == 3) && /* write-protection fault */
- ptwr_do_page_fault(addr) )
+ ptwr_do_page_fault(d, addr) )
{
- if ( unlikely(d->mm.shadow_mode) )
- (void)shadow_fault(addr, regs->error_code);
+ UNLOCK_BIGLOCK(d);
return EXCRET_fault_fixed;
}
+ UNLOCK_BIGLOCK(d);
}
- if ( unlikely(d->mm.shadow_mode) &&
- (addr < PAGE_OFFSET) && shadow_fault(addr, regs->error_code) )
+ if ( unlikely(shadow_mode_enabled(d)) &&
+ ((addr < HYPERVISOR_VIRT_START) ||
+ (shadow_mode_external(d) && GUEST_CONTEXT(v, regs))) &&
+ shadow_fault(addr, regs) )
return EXCRET_fault_fixed;
- if ( unlikely(addr >= LDT_VIRT_START) &&
- (addr < (LDT_VIRT_START + (d->mm.ldt_ents*LDT_ENTRY_SIZE))) )
- {
- /*
- * Copy a mapping from the guest's LDT, if it is valid. Otherwise we
- * send the fault up to the guest OS to be handled.
- */
- off = addr - LDT_VIRT_START;
- addr = d->mm.ldt_base + off;
- if ( likely(map_ldt_shadow_page(off >> PAGE_SHIFT)) )
- return EXCRET_fault_fixed; /* successfully copied the mapping */
- }
+ if ( unlikely(addr >= PERDOMAIN_VIRT_START) &&
+ unlikely(addr < PERDOMAIN_VIRT_END) &&
+ handle_perdomain_mapping_fault(addr - PERDOMAIN_VIRT_START, regs) )
+ return EXCRET_fault_fixed;
- if ( !GUEST_FAULT(regs) )
+ if ( !GUEST_MODE(regs) )
goto xen_fault;
propagate_page_fault(addr, regs->error_code);